perm filename UDPLAY.FAI[T,LCS] blob sn#026006 filedate 1973-02-20 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	UDPLAY WITH SPACEWAR, DECEMBER 1972
C00010 00003	 BEGIN MAIN BODY OF PROGRAM
C00013 00004	 FILLBUF
C00020 00005	 FIND FILE
C00021 00006	 SPACE WAR JOB
C00024 00007	 GETBUF - MAKE AN I/O BUFFER
C00025 00008	 UUO SERVICE
C00026 00009	 STORAGE:
C00027 ENDMK
C⊗;
	TITLE	UDPLAY WITH SPACEWAR, DECEMBER 1972

;  ROUTINE TO READ THE OUTPUT FROM THE MUSIC
;  PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;  
;   READS FROM UDP DATA WRITTEN WITH 'MUSIO'.  THIS READS FROM A FILE
;   STRUCTURED UDP ONTO DAC

↓A   ←   1     ;WORK
↓B   ←   2     ;WORK
RET ←   3     ;RETURN ACCUMULATOR
C   ←   4     ;WORK
↓PTR ←	11	;BUFFER POINTER
↓P   ←	17    ;A PDL
PLEN←	10    ;SIZE OF PDL

NOWAIT←400	; INHIBIT 'XXX is busy, will you wait?`

EXTERNAL JOBFF,JOBREL,JOBSA,JOBSYM,GTFILN
;GTFILN IS TO BE FOUND ON TVRLIB[1,TVR]

;** CHANGE NEXT TO 14 FOR 'UDPBIG' (TO PLAY AT HIGH SRATES-DOUBLES CORE)
;SEE IF 20 RATHER THAN 7 KEEPS US GOIN'
;BLKS ← =18
;BLKS ←← =10
BLKS ←← =20

;**** 1312 IS FOR 2314 DSK.  CHANGE NUMBER IF NEEDED FOR 3330 DSK. *****
UDPSIZ←←200*=18+40	;18(DECIMAL) 200(OCTAL) WORD RECORDS + 40 (OCTAL) RETRIEVAL RECORD
LNKSIZ ←← =4		;except for 4 link words.
BLKSIZ ←← UDPSIZ-LNKSIZ	;use the whole 1056 words in each block for data,
ENTSIZ ←← =6		;number of words in each directory entry.
DIRSIZ ←← ((BLKSIZ-LNKSIZ)/ENTSIZ)*ENTSIZ	;number of usable words in each directory block (175 6-word entries).
BUFSIZ ← BLKSIZ*BLKS

↓DSKCHN ←1             ;DISK CHANNEL FOR INPUT
↓ADCHN  ←2             ;D-A CHANNEL FOR OUTPUT

	OPDEF SJRST [1B8]
	OPDEF ERROR [2B8]
	OPDEF	READCH [51B8]
	OPDEF RESET [CALLI 0]
	OPDEF CORE [CALLI 11]
	OPDEF SLEEP [CALLI 31]
	OPDEF SETNAM [CALLI 400002]
	OPDEF DISMIS [CALLI 400042]
	OPDEF DSKPPN [CALLI 400071]
	OPDEF LOCK   [CALLI 400076]
	OPDEF UNLOCK [CALLI 400077]
        OPDEF   MESSAGE[51B8!3B12]

BEG:	HLRO A,JOBSYM	;SAVE SYMBOLS
	MOVN A,A
	ADD A,JOBSYM
	HRLM A,JOBSA
	HRRZM A,JOBFF
	MOVE A,[SIXBIT/UDPLAY/]
	SETNAM A,
	RESET
	MOVE P,[IOWD PLEN,PLIST]
	MOVE [JSR UUOSER]
	MOVEM 41
	OUTSTR [ASCIZ/
*** Play from file structured UDP (with Spacewar) ***
    (Use UDFAST for 100KC in scratch area or non-
    structured UDP)
/]
	PUSHJ P,GETUDP	;MAKE SURE WE HAVE UDP BEFORE DOING DIALOGUE
	MOVEI A,BUFSIZ+4	;GET FIRST BUFFER FOR UDP
	PUSHJ P,GETBUF
	MOVEM A,PBUFFER
FLOOP:	OUTSTR [ASCIZ/
UDP FILE = /]
	PUSH P,[FILENAM-2]
	PUSHJ P,GTFILN
	PUSH P,[FILENAM]
	PUSHJ P,SEARCH
	JRST [	OUTSTR [ASCIZ/FILE NOT FOUND/]
		JRST FLOOP]
	MOVEM 1,FILNUM
	RESET
;FIND OUT NUMBER OF CHANNELS AND
;THE SPEED.
NCHNS:	OUTSTR	[ASCIZ/
How many channels? /]
	INCHRW	A
	CAIE A,175
	CAIN A,177
	JRST BEG
	CAIE A,15
	CAIN A,12
	JRST NCHNS+1
	SUBI	A,"0"+1		;CONVERT TO BINR AND ADD 1
	CAIG A,3
	SKIPGE A
	JRST [	OUTSTR [ASCIZ/
Illegal number of channels/]
		JRST NCHNS]
	DPB	A,[POINT 2,OUTBIT,26]

SETSPD:	OUTSTR [ASCIZ/
What is the speed? /]
	INCHRW  A
	CAIE A,175
	CAIN A,177
	JRST BEG
	CAIE A,15
	CAIN A,12
	JRST SETSPD+1
	SUBI	A,"0"
	CAIG A,5
	SKIPG A
	JRST [	OUTSTR [ASCIZ/
Illegal speed/]
		JRST SETSPD]
	DPB	A,[POINT 3,OUTBIT,32]
; GET READY TO PLAY

LX:	OUTSTR [ASCIZ/
Type 'P` to play:  /]
	INCHRW A
	CAIE A,175
	CAIN A,177
	JRST BEG
	CAIE A,15
	CAIN A,12
	JRST LX+1
	caie a,"P"
	jrst LX
	PUSHJ P,[
	GETUDP:	INIT DSKCHN,NOWAIT+17  ;MODE
		SIXBIT/UDP/		;DEVICE NAME
		0			;NO BUFFER HEADERS
		SKIPA
		POPJ P,
		ERROR [ASCIZ/
UDP is in use or assigned to another job.
/]
	ENTER	DSKCHN,[0
		0
		0
		0]
	ERROR [ASCIZ/
I'm sorry, but I don't believe that you have the Scratch Pack mounted.
Maybe someone has put a password on it.
/]]
	MOVEI A,BUFSIZ+4	;GET FIRST BUFFER FOR UDP
	PUSHJ P,GETBUF
	MOVEM A,PBUFFER
	ADDI A,BUFSIZ
	MOVEM A,PBUFEND
	MOVE A,PBUFFER		;MAKE AN IOWD FOR THE LOSING SPACEWAR
	SUB A,[XWD BUFSIZ,1]	;JOB
	MOVEM A,ADIOWD		;WHEN HE GETS THIS, HE'LL GO
GETAD:	OPEN	ADCHN,[117 	;MODE
         	'AD    '        ;DEVICE NAME
 		0]              ;NO BUFFER HEADERS

  	ERROR [ASCIZ/Device AD is unavailable.
/]
;	INPUT DSKCHN,[IOWD 1,NWD
;	               0 ]
	MOVE PBUFEND		;CONVINCE FILLBUF TO FILL THE BUFFER
	MOVEM PDP6WD
	SETOM WRAP		;FOR THE CONVIENCE OF FILLBUF, SET TO ZERO
				;AFTER CALLING IT
	SETOM RUDONE		;DON'T START YET
	MOVE PTR,PBUFFER	;NEXT WORD TO USE IN BUFFER
	MOVE FILNUM		;SET UP FILE NUMBER
	MOVEM 3(PTR)
	PUSHJ P,FILLBUF		;FILL UP BUFFER
	JFCL			;DON'T WORRY ABOUT ERROR RETURNS!
	SETZM WRAP
PLA2:	MOVEI A,10
	MOVEM A,WT#
	SPCWAR 17,SWJOB		;START THE SPACEWAR JOB GOING
	MOVEI A,1
	SKIPL WT
	JRST[	SLEEP A,	;WAIT FOR A FEW SECONDS
		JRST .-1]
	OUTSTR [ASCIZ/
GO? /]
	INCHRW A		;NOW WAIT FOR THE USER
	CAIE A,175		;DOES HE WANT TO GIVE UP
	CAIN A,177
	JRST OUT		;YES!
	MOVE A,[SIXBIT/GOT 6!/]	;TELL THE WORLD THAT WE'RE NASTY!
	SETNAM A,
	LOCK			;LOCK US INTO CORE!
; BEGIN MAIN BODY OF PROGRAM

	SETZM DATERR		;CLEAR ERROR FLAG
	SETZM RUDONE
	SETZM PDPERR		;THIS STARTS IT
LOOP:	PUSHJ P,FILLBUF		;FILL UP THE BUFFER
	JRST [	SKIPN RUDONE	;STILL RUNNING?
		SJRST LOOP	;MORE TO GO, SLEEP 1/60 SECOND AND TRY AGAIN
		JRST OUT1]
OUT1:	SKIPN RUDONE		;PDP-10 DONE!, WAIT FOR PDP-6
	SJRST OUT1		;SLEEP AND TRY AGAIN
OUT:	UNLOCK			;UNLOCK US FROM CORE
	SPCWAR 0,'SSW'
	MOVE A,[SIXBIT/UDPLAY/]
	SETNAM A,
	close dskchn,		;END OF PROGRAM.
	releas adchn,
	RESET			;RESET I/O AND FREE BUFFER SPACE
SHRINK:	MOVE A,JOBFF
	CORE A,
	ERROR [ASCIZ/HORRIBLE ERROR! CAN'T SHRINK CORE!!!/]
	SKIPE DATERR
	ERROR [ASCIZ/Data transmission error./]
	SKIPE PDPERR
	ERROR [ASCIZ/
The PDP-6 is hung, try restarting it at 204./]
	SKIPE WRAP
	OUTSTR [ASCIZ/
CAN'T GET UDP ACCESS FAST ENOUGH OR NOT BEING RUN QUICKLY ENOUGH,
TRY AGAIN, AND IF YOU STILL LOSE, SEE IF YOU CAN GET PEOPLE TO STOP
WHILE YOU TRY A THIRD(?) TIME.
GOOD LUCK!/]
	jrst LX
SUBTTL  FILLBUF
COMMENT ⊗

   FILLBUF READS FROM A FILE STRUCTURED UDP INTO A CIRCULAR BUFFER
   AND KEEPS IOWDS READY FOR THE PDP-6.  IT KEEPS TWO IOWDS AROUND
   OUTWC AND NOUTWC. OUTWC IS USED BY PDP-6 ROUTINE TO GET AN IOWD
   INTO ITS AC. ONCE IT OBTAINS IT, IT ZEROS IT SO THAT THE PDP-10
   ROUTINE KNOWS IT HAS IT.  THE PDP-10 UPDATES THIS WORD WHENEVER
   IT READS MORE IN UNTIL IT WRAPS AROUND.  THEN IT USES NOUTWC IN
   THE SAME WAY AS OUTWC,  CHECKING PDP6WD TO MAKE SURE IT DOESN'T
   OVERWRITE THE PART OF THE BUFFER THE PDP-6 IS USING.  WHEN THIS
   HAPPENS,  FILLBUF TAKES A NON-SKIP RETURN,  INDICATING THAT THE
   BUFFER IS FULL.  IF END OF FILE OCCURS, IT TAKES A SKIP RETURN.


UDP block format (from UDP[CSP,SYS]):

_________________________________________________
|						|
|						|
|						|
|		UDPBLK-4 data words		|
|						|
|						|
|_______________________________________________|
|	    BLOCK IDENTIFIER (unique)		|
| (UDP block number of first block of the file)	|
|_______________________________________________|
|	    LINK TO PRECEEDING BLOCK		|
|      (-1 for the first block of a file)	|
|_______________________________________________|
|						|
|	 UDP BLOCK NUMBER OF THIS BLOCK		|
|_______________________________________________|
|	    LINK TO FOLLOWING BLOCK		|
|	(-1 for the last block of a file)	|
|_______________________________________________|

The link information is used to chain together the parts of  a  file,
which  need  not  be in sequential order.  They are at the end of the
block so that in loading a core buffer with a data file, the parts of
the  file may simply be read in over the link info for the preceeding
block.
⊗;
	BEGIN FILLBUF
↑FILLBU:
	HRRZ A,PDP6WD		;GET LAST BLOCK PDP-6 FINISHED
	CAILE A,(PTR)
	JRST BELOW
; WHEN PDP-10 ABOVE PDP-6, CHECK WITH END OF BUFFER.  IF END OF BUF-
; FER, RESET TO BEGINNING OF BUFFER AND SET WRAP TO -1
ABOVE:	CAMN PTR,PBUFEND	;AT END?
	JRST ATEND
	SKIPG 3(PTR)		;NO, MAKE SURE THERE'S SOMETHING THERE
	JRST [	SETZM (PTR)
		MOVS PTR	;BLT UP A WORD OF ZEROS
		HRRI 1(PTR)
		BLT @PBUFEND	;ZERO REMAINDER OF BUFFER
		SETZM WRAP	;SO HE WON'T WRAPAROUND
		AOS (P)		;EOF
		POPJ P,]
	PUSHJ P,DOREAD		;READ BLOCK INTO BUFFER
	ADDI PTR,BLKSIZ
	JRST FILLBU
ATEND:	MOVE A,3(PTR)		;COPY LINK TO FOLLOWING BLOCK
	MOVE PTR,PBUFFER
	MOVEM A,3(PTR)
	SETOM WRAP
	JRST FILLBU
; WHEN PDP-10 BELOW PDP-6, CHECK WITH PDP-6 AND MAKE SURE PDP-6 HAS
; NOT GRONKED WRAP
BELOW:	
;	SKIPL WRAP		;IF PDP-6 GRONKED IT, THEN DO A
;	JRST [	AOS (P)		;FAILURE RETURN
;		POPJ P,]
	SKIPG 3(PTR)		;MAKE SURE THERE'S SOMETHING THERE
	JRST [	MOVE PBUFFER	;MAKE A NEW IOWD
		SUB PTR
		HRLM ADIOWD
		SETZM WRAP	;TELL PDP-6 I'M DONE
		AOS (P)		;EOF
		POPJ P,]
	CAIG A,UDPSIZ(PTR)	;ARE WE SITTING ON HIM?
	POPJ P,			;CONSIDER BUFFER IS FULL THEN
	PUSHJ P,DOREAD		;READ A BLOCK
	ADDI PTR,BLKSIZ
	JRST FILLBU
; READ A BLOCK INTO OUR BUFFER
DOREAD:	MOVE 3(PTR)
	MOVEM BLKNUM
	MOVNI UDPSIZ
	HRLI -1(PTR)
	MOVSM UDPIOWD
	IN DSKCHN,UDPIOWD
	POPJ P,
	OUTSTR [ASCIZ/UDP ERROR, WILL CONTINUE
/]
	POPJ P,
	BEND FILLBUF
SUBTTL  FIND FILE

BEGIN SEARCH

FILE←B
EXT←FILE+1
PPN←EXT+2

↑SEARCH: MOVEI 1
	MOVEM BLKNUM
	MOVE PBUFFER
	SUBI 1
	HRLI -DIRSIZ
	MOVEM UDPIOWD
	IN DSKCHN,UDPIOWD
	CAIA
	ERROR [ASCIZ/ERROR READING UDP DIRECTORY
/]
	MOVEI FILE
	HRL -1(P)
	BLT PPN
	SKIPN PPN
	DSKPPN PPN,
	MOVE A,PBUFFER
	ADDI A,DIRSIZ-ENTSIZ
LOOP:	SUBI A,ENTSIZ
	CAMGE A,PBUFFER
	POPJ P,
	CAMN PPN,3(A)
	CAME FILE,(A)
	JRST LOOP
	HLLZ 1(A)
	CAME EXT
	JRST LOOP
	HRRZ 1,1(A)
	AOS (P)
	SUB P,[XWD 2,2]
	JRST @2(P)
	BEND
; SPACE WAR JOB

	BEGIN SWJOB

	AD←←424
	DC←←204
	PI←4
	PION←←200
	PIOFF←←400
	
↑SWJOB:	SOSL WT		;ARE WE DONE WAITING?
	DISMIS		;NO, RETURN
	SKIPE RUDONE	;ARE WE DONE?
	DISMIS		;YES, RETURN
	CONSZ 40		;CHECK TO SEE IF ON THE PDP-6
	JRST[	SETOM PDPERR
		SETOM RUDONE
		DISMIS]
	CONO PI,PIOFF	;I REALLY HATE TO DO THIS BUT...
	SETOM PIFLAG
	MOVE 2,OUTBIT	;SET UP THE AD
	CONO AD,(2)
	MOVE 2,ADIOWD+1	;AND THE 136
	CONO DC,(2)
	MOVEI 2,BLKSIZ	;SET WORD COUNT FOR NEXT STATUS
GETBUF:	MOVE 1,ADIOWD	;GET IOWD FOR BUFFER
LOOP:	CONSO DC,1000	;IS THE 136 READY FOR A WORD
	JRST LOOP	;NO, TRY AGAIN
	BLKO DC,1	;YES, GIVE IT TO HIM
	JRST NXTBUF	;HE RAN OUT OF DATA, GET READY FOR MORE
	SOJGE 2,LOOP	;DID WE FINISH A BLOCK?
	MOVEM 1,PDP6WD	;TELL PDP-10 WHAT WE WILL USE
	MOVEI 2,BLKSIZ	;SET WORD COUNT FOR NEXT STATUS
	JRST LOOP	;OK, WAIT FOR 136 TO BE READY
NXTBUF:	EXCH 1,WRAP	;TELL PDP-10 WE'VE WRAPPED AROUND
	SKIPN KILL
	JUMPL 1,GETBUF
	MOVEM 1,WRAP	;REPLACE WITH LOSER
	CONSZ DC,10000	;DID WE GET DATA MISSED?
	SETOM DATERR	;SET LOSING FLAG
	CONO PI,PION	;LET TIME-SHARING CONTINUE
	SETZM PIFLAG
	SETOM RUDONE	;TELL PDP-10 WE'RE DONE
	DISMIS
↑KILL:	 0
↑PDPERR: 0
↑DATERR: 0
↑RUDONE: 0
↑PDP6WD: 0
↑WRAP:	 0
↑PIFLAG: 0
	BEND SWJOB
; GETBUF - MAKE AN I/O BUFFER

	BEGIN ALLOC

↑GETBUF:ADD A,JOBFF	
	PUSH P,A	;SAVE WHAT WILL BE JOBFF
GETBU2:	CALL A,[SIXBIT/CORE/]
	JRST [	OUTSTR [ASCIZ/
Can't get enough core!
/]
		MOVE A,(P)	;RECOVER WHAT SHOULD BW JOBFF
		HALT GETBU2]	;ALLOW THE LOSER TO TRY AGAIN
	POP P,A		;RECOVER WHAT WILL BE JOBFF
	EXCH A,JOBFF
	POPJ P,

	BEND ALLOC
; UUO SERVICE

	BEGIN UUOSER
↑UUOSER: 0
	MOVEM A,SAVEA#
	LDB A,[POINT 9,40,8]
	CAIG A,MAXUUO
	JUMPG A,@UUOTAB(A)
	OUTSTR [ASCIZ/ILLEGAL USER/]	;UUO AT /]
;	HRRZ A,UUOSER
;	PUSH P,A
;	PUSHJ P,OCTOUT
	CALLI 1,12
	OUTSTR [ASCIZ/CAN'T CONTINUE/]
	JRST .-2
UUORET:	MOVE A,SAVEA
	JRST 2,@UUOSER
UUOTAB←.-1
	[ SETZ A,			;1	SLEEP & JRST
	  SLEEP A,
	  MOVE A,40
	  HRRM A,UUOSER
	  JRST UUORET]
	[ OUTSTR @40			;2	ERROR
	  CALLI 1,12
	  JRST UUORET]
MAXUUO←.-UUOTAB
	BEND UUOSER
; STORAGE:

NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
	0
CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
	0

↓PBUFFER: 0			;POINTER TO BEGINNING OF BUFFER
↓PBUFEND: 0			;POINTER TO END OF BUFFER
↓FILNUM:  0

↓UDPIOW: 0			;WILL CONTAIN AN IOWD
↓BLKNUM: 0

↓ADIOWD: 0			;WILL CONTAIN AN IOWD FOR D-A
	3650			;MAGIC BITS FOR 136.
OUTBIT: 4000			;BITS FOR D-A
	BLOCK  2
FILENAM: BLOCK 4
PLIST:	BLOCK PLEN

end beg